import json
import re
import requests


class QuestionScore:
    def __init__(self, position):
        self.message = []
        self.position = position
        self.url = "https://api.siliconflow.cn/v1/chat/completions"
        self.payload = {
            "model": "Qwen/Qwen3-14B",
            "messages": self.message,
            "stream": False,
            "max_tokens": 4000,
            "min_p": 0.05,
            "stop": None,
            "temperature": 0.7,
            "top_p": 0.7,
            "top_k": 50,
            "frequency_penalty": 0.5,
            "n": 1,
            "response_format": {"type": "text"}
        }
        self.headers = {
            "Authorization": "Bearer sk-dgxjhtoohyyxvjzoouixerefxbwvwrtnenkejpkoxntxhiyg",
            "Content-Type": "application/json"
        }


    def score_to_ans(self, QA):
        # QA是列表数据，转换成字符串
        qa_str = "\n\n".join([f"Q: {q.split(',')[0]}\nA: {q.split(',')[1]}" for q in QA])
        self.message.append({
            "role": "user",
            "content": (
            f"你是一个经验非常丰富的计算机行业的面试官，面试者面试的岗位是{self.position},以下是面试者在面试过程中的问题和回答{qa_str}，"
            f"请从专业知识水平、技能匹配度、语言表达能力、逻辑思维能力、创新能力、应变抗压能力六个维度进行评分，满分100分，良好对应70~85，优秀对应85~95，并根据问题和回答对每个维度做出表现评价，评价面试者表现，主语是'你'"
            f"此外，给出一个150字左右的评语，评价面试者的表现，主语为'你'。"
            f"返回示例："
            f'{{"knowledge": "专业知识水平得分","skill": "技能匹配度得分","language": "语言表达能力得分",'
            f'"logic": "逻辑思维能力得分","innovate": "创新能力得分","stress": "应变抗压能力得分",'
            f'"konwlege_evaluate":"专业知识表现评价","skill_evaluate":"技能匹配度表现评价","language_evaluate":"语言表达能力评价",'
            f'"logic_evaluate":"逻辑思维能力表现评价","innovate_evaluate":"创新能力表现评价","stress_evaluate":"应变抗压能力表现评价",'
            f'"evaluate":"面试者表现评价"}}'
            )
        })
        response = requests.request("POST", self.url, json=self.payload, headers=self.headers)
        print("回答评分原始数据：",response.text)
        # 解析JSON并提取content和code
        full_response = json.loads(response.text)
        # Step 2: 提取 content 字符串
        content = full_response["choices"][0]["message"]["content"]
        # Step 3: 从 content 中提取嵌套的 JSON 分数字符串（注意它是字符串，不是对象）
        match = re.search(r"\{.*?\}", content, re.DOTALL)
        if not match:
            raise ValueError("没有找到嵌套的评分 JSON")
        score_json_str = match.group(0)
        # Step 4: 将嵌套的 JSON 字符串解析为 Python 字典
        score_data = json.loads(score_json_str)
        # Step 5: 提取各项分数（并转成整数）
        fields = ["knowledge", "skill", "language", "logic", "innovate", "stress"]
        score = {field: score_data.get(field, "") for field in fields} # 面试评分

        # 六个维度评价（使用正确的键提取）
        evaluate_key_map = {
            "knowledge_evaluate": "konwledge_evaluate",  # 注意拼写
            "skill_evaluate": "skill_evaluate",
            "language_evaluate": "language_evaluate",
            "logic_evaluate": "logic_evaluate",
            "innovate_evaluate": "innovate_evaluate",
            "stress_evaluate": "stress_evaluate"
        }
        detail_evaluate = {
            std_key: score_data.get(real_key, "")
            for std_key, real_key in evaluate_key_map.items()
        }

        evaluate = score_data.get("evaluate", "") # 面试总体评价

        print("面试评分：",score)
        print("面试评价：",evaluate)
        print("六个维度评价：",detail_evaluate)

        return score, evaluate, detail_evaluate

if __name__ == '__main__':
    agent = QuestionScore("java后端工程师")
    QA=['对于问题在大学生服务外包——创新创业大赛中，你负责项目的前端设计和前端代码编写，能具体讲讲在前端设计方面，你是如何规划页面布局和交互流程的，以及遇到了哪些挑战和是如何解决的吗？,面试者的回答是通过 CSS Grid/Flexbox 断点策略 + 移动优先原则解决多端兼容问题；使用 状态机（如XState） 管理流程，配合 动效缓动曲线 提升体验；', '对于问题在软件杯大赛中，你负责agent智能体的设计和实现，主要用到讯飞星火大模型。那么，在这个过程中，你是如何处理智能体与前端界面之间的数据交互和集成的呢？,面试者的回答是通过 Axios/Fetch 封装标准化请求，统一错误处理与数据格式（如 REST/GraphQL）；', '对于问题你提到使用Axios/Fetch封装标准化请求以及统一错误处理与数据格式，那在实际操作中，如何确保智能体与前端界面之间的数据传输安全性呢？比如有没有采取一些加密措施或者身份验证机制？,面试者的回答是强制 HTTPS 加密传输', '对于问题除了强制HTTPS加密传输，在数据传输过程中，是否还考虑了其他安全方面的措施，比如数据完整性校验、防止数据被篡改等，以及如何实现这些措施呢？,面试者的回答是', '对于问题在软件杯大赛中，你使用讯飞星火大模型来设计和实现agent智能体，那么在这个项目中，你是如何对大模型的输出进行后处理和优化，以使其更符合前端界面的展示需求呢？,面试者的回答是使用 TLS 1.2+ 协议（如 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 套件），禁用不安全的 SSLv3 和 TLS 1.0，防止中间人攻击和数据窃听。', '对于问题你在大学期间担任学院宣传部部长，负责制作海报、视频剪辑、活动宣传等。那在组织一些大型活动的宣传工作过程中，有没有遇到过时间紧张、任务繁重的情况呢？你是如何协调各项任务，确保宣传工作顺利完成的呢？,面试者的回答是有，活动与期末考试冲突，我将任务分给部门同学，这样每个人的任务就少了，大家一起完成，效率很高']
    agent.score_to_ans(QA)